home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
cg.lha
/
cg
/
src
/
EvalC3.mi
< prev
next >
Wrap
Text File
|
1992-11-24
|
32KB
|
1,036 lines
IMPLEMENTATION MODULE EvalC3;
IMPORT SYSTEM, System, IO, Tree;
(* line 7 "" *)
FROM SYSTEM IMPORT ADR, TSIZE;
FROM General IMPORT Max;
FROM DynArray IMPORT MakeArray;
FROM IO IMPORT WriteS, WriteNl, WriteI, WriteB, StdOutput;
FROM Texts IMPORT WriteText;
FROM Sets IMPORT tSet, MakeSet, ReleaseSet, Include, Exclude, Minimum,
Maximum, IsElement, WriteSet, IsEmpty, Extract;
FROM Relations IMPORT IsRelated;
FROM TreeC1 IMPORT BSS;
FROM TreeC2 IMPORT GetIterator, Iterator, WriteLine;
FROM EvalC IMPORT Class;
FROM Errors IMPORT Error, Short, MessageI;
FROM Positions IMPORT NoPosition;
IMPORT EvalC;
FROM Tree IMPORT
NoTree , tTree , Referenced , NoCodeClass ,
Computed , Reverse , Write , Read ,
Inherited , Synthesized , Input , Output ,
Virtual , Test , Left , Right ,
HasOutput , NonBaseComp , Dummy , Trace ,
Demand , Funct , NoClass , Options ,
TreeRoot , iModule , iMain , itTree ,
ForallClasses, ForallAttributes, f , WI , WN ,
ClassCount , IdentifyClass , IdentifyAttribute,
tBitIndex , tBitInfo , iNoTree , QueryTree ;
VAR
i, i2, j, k, n, MaxBit, MaxInstCount, Check: SHORTCARD;
Node, Attr, ChildsClass : tTree;
Success, IsStable : BOOLEAN;
BitIndexSize : LONGINT;
gBitIndex : tBitIndex;
InhIndices : tSet;
InhIndexSize : LONGINT;
InhIndexCount : POINTER TO ARRAY [1..1000000] OF SHORTCARD;
PROCEDURE GenCall (t: tTree; j: SHORTCARD);
BEGIN
WITH t^.Class.Instance^ [j] DO
IF ({Synthesized, Left} <= Properties) THEN
k := ToBit0 (t, j);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
WriteS (f, "yyS"); WN (k); WriteS (f, " (yyt); /* "); WI (Attribute^.Child.Name); WriteS (f, " */ }"); WriteNl (f);
ELSIF ({Inherited, Left} <= Properties) THEN
k := ToBit0 (t, j);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyVisitParent (yyt); ");
WriteS (f, "yyI [yyt->yyHead.yyOffset + "); WN (k); WriteS (f, "](yyt->yyHead.yyParent); /* ");
WI (Attribute^.Child.Name); WriteS (f, " */ ");
WriteS (f, 'yyWriteVisit (yyt->yyHead.yyParent, "?"); }'); WriteNl (f);
ELSE
WriteS (f, "yyI [yyt->yyHead.yyOffset + "); WN (k); WriteS (f, "](yyt->yyHead.yyParent); /* ");
WI (Attribute^.Child.Name); WriteS (f, " */ }"); WriteNl (f);
END;
ELSIF ({Inherited, Right} <= Properties) THEN
k := ToBit1 (Selector, j - t^.Class.AttrCount - Selector^.Child.InstOffset);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt->"); WI (Class^.Class.Name);
WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
k := ToBit2 (t, Selector, j);
WriteS (f, "yyI"); WN (k); WriteS (f, " (yyt); /* "); WI (Selector^.Child.Name);
WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, " */ }"); WriteNl (f);
ELSIF ({Synthesized, Right} <= Properties) THEN
k := ToBit1 (Selector, j - t^.Class.AttrCount - Selector^.Child.InstOffset);
WriteS (f, "IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt->"); WI (Class^.Class.Name);
WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ") ");
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteVisit (yyt, "'); WI (Selector^.Child.Name); WriteS (f, '"); ');
WriteS (f, "yyS"); WN (k);
WriteS (f, " (yyt->"); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "); /* "); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, " */ ");
WriteS (f, "yyVisitParent (yyt->"); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "); }"); WriteNl (f);
ELSE
WriteS (f, "yyS"); WN (k);
WriteS (f, " (yyt->"); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "); /* "); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, " */ }"); WriteNl (f);
END;
END;
END;
END GenCall;
PROCEDURE GenEvalAttr (t: tTree; i: INTEGER);
BEGIN
Class := t;
WITH t^.Class.Instance^ [i] DO
IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
EvalC.GenEvaluator (Action); WriteNl (f);
IF Test IN Properties THEN
WriteS (f, "writebool (yyb) yyWriteNl ();"); WriteNl (f);
ELSIF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
WriteS (f, "write"); WI (itTree);
WriteS (f, " (yyt->"); WI (t^.Class.Name); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ")"); WriteNl (f);
ELSE
WriteS (f, "write"); WI (Attribute^.Child.Type);
WriteS (f, " (yyt->"); WI (t^.Class.Name); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ") yyWriteNl ();"); WriteNl (f);
END;
ELSE
WriteS (f, "yyWriteNl ();"); WriteNl (f);
END;
ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
EvalC.GenEvaluator (Action);
END;
ELSE
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
EvalC.GenEvaluator (Action);
END;
END;
END;
END GenEvalAttr;
PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
BEGIN
IO.WriteS (IO.StdError, 'Error: module EvalC3, routine ');
IO.WriteS (IO.StdError, yyFunction);
IO.WriteS (IO.StdError, ' failed');
IO.WriteNl (IO.StdError);
Exit;
END yyAbort;
PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
VAR yyi : INTEGER;
BEGIN
FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
END;
RETURN TRUE;
END yyIsEqual;
PROCEDURE EvalImplC (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 2: yyR2: RECORD
a: SHORTCARD;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Ag) THEN
(* line 127 "" *)
WITH t^.Ag DO
(* line 127 "" *)
MaxBit := 0;
MaxInstCount := 0;
ForallClasses (Classes, CompBitInfo);
MakeSet (InhIndices, MaxInstCount);
InhIndexSize := MaxInstCount;
MakeArray (InhIndexCount, InhIndexSize, TSIZE (SHORTCARD));
FOR i := 1 TO MaxInstCount DO InhIndexCount^ [i] := 0; END;
ForallClasses (Classes, CompInhIndices);
WriteS (f, '# define IFNOTIN(b, s) if (! (s & 1 << b)) {'); WriteNl (f);
WriteS (f, "# define INCL(s, b) s |= 1 << b"); WriteNl (f);
WriteS (f, "# define REMOTE_SYN(i, b, c, n, t, a) (n->yyHead.i & 1 << b ? (void) 0 : c (n), n->t.a)"); WriteNl (f);
WriteS (f, "# define REMOTE_INH(i, b, k, n, t, a) (n->yyHead.i & 1 << b ? (void) 0 : yyI [n->yyHead.yyOffset + k](n->yyHead.yyParent), n->t.a)"); WriteNl (f);
EvalC.EvalImplHead (t);
WriteNl (f);
WriteS (f, "static void yyE ARGS((register "); WI (itTree); WriteS (f, " yyt));"); WriteNl (f);
FOR i := 1 TO MaxBit - 1 DO
WriteS (f, "static void yyS"); WN (i); WriteS (f, " ARGS((register "); WI (itTree); WriteS (f, " yyt));"); WriteNl (f);
END;
FOR i := Minimum (InhIndices) TO Maximum (InhIndices) DO
IF IsElement (i, InhIndices) THEN
WriteS (f, "static void yyI"); WN (i); WriteS (f, " ARGS((register "); WI (itTree); WriteS (f, " yyt));"); WriteNl (f);
END;
END;
WriteNl (f);
WriteS (f, "static "); WI (iMain); WriteS (f, "_tProcTree yyI ["); WN (Maximum (InhIndices) + 1); WriteS (f, "] = { 0,"); WriteNl (f);
FOR i := 1 TO Maximum (InhIndices) DO
IF IsElement (i, InhIndices) THEN
WriteS (f, " yyI"); WN (i); WriteS (f, ","); WriteNl (f);
ELSE
WriteS (f, " 0,"); WriteNl (f);
END;
END;
WriteS (f, "};"); WriteNl (f);
WriteNl (f);
WriteS (f, "static void yyAbort"); WriteNl (f);
WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
WriteS (f, "# else"); WriteNl (f);
WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
WriteS (f, "# endif"); WriteNl (f);
WriteS (f, "{"); WriteNl (f);
WriteS (f, ' (void) fprintf (stderr, "Error: module '); WI (EvalName); WriteS (f, ', cyclic dependencies\n");'); WriteNl (f);
WriteS (f, " "); WI (iMain); WriteS (f, "_Exit ();"); WriteNl (f);
WriteS (f, "}"); WriteNl (f);
WriteNl (f);
WriteS (f, "void "); WI (EvalName); WriteNl (f);
WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
WriteS (f, " ("); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
WriteS (f, "# else"); WriteNl (f);
WriteS (f, " (yyt) "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
WriteS (f, "# endif"); WriteNl (f);
IF NOT IsElement (ORD ('9'), Options) THEN
WriteS (f, "{ Init"); WI (iModule); WriteS (f, " (yyt); yyE (yyt); }"); WriteNl (f);
ELSE
WriteS (f, "{"); WriteNl (f);
WriteS (f, " char xxHigh;"); WriteNl (f);
WriteS (f, " xxStack = 1000000000;"); WriteNl (f);
WriteS (f, " Init"); WI (iModule); WriteS (f, " (yyt); yyE (yyt);"); WriteNl (f);
WriteS (f, ' (void) printf ("Stacksize %d\n", (int) & xxHigh - xxStack);'); WriteNl (f);
WriteS (f, "}"); WriteNl (f);
END;
WriteNl (f);
REPEAT IsStable := TRUE; ForallClasses (Classes, CompOutput); UNTIL IsStable;
WriteS (f, "static void yyE"); WriteNl (f);
WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
WriteS (f, " (register "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
WriteS (f, "# else"); WriteNl (f);
WriteS (f, " (yyt) register "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
WriteS (f, "# endif"); WriteNl (f);
WriteS (f, "{"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " char xxLow;"); WriteNl (f);
WriteS (f, " xxStack = Min (xxStack, (int) & xxLow);"); WriteNl (f);
END;
WriteS (f, " for (;;) {"); WriteNl (f);
WriteS (f, " if (yyt == "); WI (iNoTree); WriteS (f, " || yyt->yyHead.yyIsComp0 & 1) return;"); WriteNl (f);
WriteS (f, " yyt->yyHead.yyIsComp0 |= 1;"); WriteNl (f);
WriteS (f, " switch (yyt->Kind) {"); WriteNl (f);
ForallClasses (Classes, GenE);
WriteS (f, " default: return;"); WriteNl (f);
WriteS (f, " }"); WriteNl (f);
WriteS (f, " }"); WriteNl (f);
WriteS (f, "}"); WriteNl (f);
WriteNl (f);
FOR i := 2 TO MaxBit DO
n := 0; (* are there any SYN attributes ? *)
ForallClasses (Classes, CountSynAttr);
IF n > 0 THEN
WriteS (f, "static void yyS"); WN (i - 1); WriteNl (f);
WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
WriteS (f, " (register "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
WriteS (f, "# else"); WriteNl (f);
WriteS (f, " (yyt) register "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
WriteS (f, "# endif"); WriteNl (f);
WriteS (f, "{"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " char xxLow;"); WriteNl (f);
WriteS (f, " xxStack = Min (xxStack, (int) & xxLow);"); WriteNl (f);
END;
IF IsElement (ORD ('5'), Options) THEN
WriteS (f, " IFNOTIN ("); WN ((i - 1) MOD BSS); WriteS (f, ", yyt->yyHead.yyIsDone"); WN ((i - 1) DIV BSS);
WriteS (f, ") INCL (yyt->yyHead.yyIsDone"); WN ((i - 1) DIV BSS); WriteS (f, ", "); WN ((i - 1) MOD BSS); WriteS (f, "); } else yyAbort (yyt);"); WriteNl (f);
END;
IF n > 1 THEN
WriteS (f, " switch (yyt->Kind) {"); WriteNl (f);
ForallClasses (Classes, GenS);
WriteS (f, " }"); WriteNl (f);
ELSE
ForallClasses (Classes, GenS);
END;
WriteS (f, " INCL (yyt->yyHead.yyIsComp"); WN ((i - 1) DIV BSS); WriteS (f, ", "); WN ((i - 1) MOD BSS); WriteS (f, ");"); WriteNl (f);
WriteS (f, "}"); WriteNl (f);
WriteNl (f);
END;
END;
FOR i := Minimum (InhIndices) TO Maximum (InhIndices) DO
IF IsElement (i, InhIndices) THEN
WriteS (f, "static void yyI"); WN (i); WriteNl (f);
WriteS (f, "# if defined __STDC__ | defined __cplusplus"); WriteNl (f);
WriteS (f, " (register "); WI (itTree); WriteS (f, " yyt)"); WriteNl (f);
WriteS (f, "# else"); WriteNl (f);
WriteS (f, " (yyt) register "); WI (itTree); WriteS (f, " yyt;"); WriteNl (f);
WriteS (f, "# endif"); WriteNl (f);
WriteS (f, "{"); WriteNl (f);
WriteLine (TreeRoot^.Ag.EvalCodes^.Codes.LocalLine);
WriteText (f, TreeRoot^.Ag.EvalCodes^.Codes.Local);
Node := TreeRoot^.Ag.Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
Node := Node^.Module.Next;
END;
IF IsElement (ORD ('9'), Options) THEN
WriteS (f, " char xxLow;"); WriteNl (f);
WriteS (f, " xxStack = Min (xxStack, (int) & xxLow);"); WriteNl (f);
END;
Check := 0;
IF InhIndexCount^ [i] > 1 THEN
WriteS (f, " switch (yyt->Kind) {"); WriteNl (f);
ForallClasses (Classes, EvalImplC);
WriteS (f, " }"); WriteNl (f);
ELSE
ForallClasses (Classes, EvalImplC);
END;
IF Check # InhIndexCount^ [i] THEN
MessageI ("internal error in yyI", Error, NoPosition, Short, ADR (i));
END;
WriteS (f, "}"); WriteNl (f);
WriteNl (f);
END;
END;
WriteS (f, "void Begin"); WI (EvalName); WriteS (f, " ()"); WriteNl (f);
WriteS (f, "{"); WriteNl (f);
WriteLine (EvalCodes^.Codes.BeginLine);
WriteText (f, EvalCodes^.Codes.Begin);
Node := Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.BeginLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Begin);
Node := Node^.Module.Next;
END;
WriteS (f, "}"); WriteNl (f);
WriteNl (f);
WriteS (f, "void Close"); WI (EvalName); WriteS (f, " ()"); WriteNl (f);
WriteS (f, "{"); WriteNl (f);
WriteLine (EvalCodes^.Codes.CloseLine);
WriteText (f, EvalCodes^.Codes.Close);
Node := Modules;
WHILE Node^.Kind = Tree.Module DO
WriteLine (Node^.Module.EvalCodes^.Codes.CloseLine);
WriteText (f, Node^.Module.EvalCodes^.Codes.Close);
Node := Node^.Module.Next;
END;
WriteS (f, "}"); WriteNl (f);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Class) THEN
(* line 319 "" *)
WITH yyTempo.yyR2 DO
LOOP
WITH t^.Class DO
(* line 320 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 321 "" *)
IF NOT (i <= InstCount) THEN EXIT; END;
(* line 322 "" *)
;
(* line 323 "" *)
a := ToAttr (t, i);
IF a = 0 THEN RETURN; END;
WITH Instance^ [a] DO
IF {Inherited, Right} <= Properties THEN
Class := t;
IF InhIndexCount^ [i] > 1 THEN
WriteS (f, " case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
END;
INC (Check);
k := ToBit1 (Selector, a - AttrCount - Selector^.Child.InstOffset);
IF IsElement (ORD ('5'), Options) THEN
WriteS (f, " IFNOTIN ("); WN (k MOD BSS); WriteS (f, ", yyt->"); WI (Class^.Class.Name);
WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, "->yyHead.yyIsDone"); WN (k DIV BSS);
WriteS (f, ") INCL (yyt->"); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "->yyHead.yyIsDone"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, "); } else yyAbort (yyt);"); WriteNl (f);
END;
FOR j := 1 TO InstCount DO
IF IsRelated (a, j, DP) THEN
GenCall (t, j);
END;
END;
IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
EvalC.GenEvaluator (Action); WriteNl (f);
IF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
WriteS (f, "write"); WI (itTree);
WriteS (f, " (yyt->"); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "->"); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ")"); WriteNl (f);
ELSE
WriteS (f, "write"); WI (Attribute^.Child.Type);
WriteS (f, " (yyt->"); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "->"); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name); WriteS (f, ") yyWriteNl ();"); WriteNl (f);
END;
ELSE
WriteS (f, "yyWriteNl ();"); WriteNl (f);
END;
ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteEval (yyt, "'); WI (Selector^.Child.Name); WriteS (f, ":"); WI (Attribute^.Child.Name); WriteS (f, '");'); WriteNl (f);
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
EvalC.GenEvaluator (Action);
END;
ELSE
IF (Action # ADR (Action)) AND NOT (Virtual IN Properties) THEN
EvalC.GenEvaluator (Action);
END;
END;
IF NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
WriteS (f, "{ register "); WI (itTree); WriteS (f, " yyr = yyt->"); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "->"); WI (Selector^.Child.Type); WriteS (f, "."); WI (Attribute^.Child.Name);
WriteS (f, "; if (yyr->yyHead.yyParent == "); WI (iNoTree);
WriteS (f, ") { yyr->yyHead.yyOffset = "); WN (Selector^.Child.Class^.Class.BitCount + Attribute^.Child.BitOffset);
WriteS (f, "; yyr->yyHead.yyParent = yyt->"); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "; Init"); WI (iModule); WriteS (f, " (yyr); } }"); WriteNl (f);
END;
FOR i2 := 1 TO InstCount DO (* add group members *)
IF Instance^[i2].Action = Action THEN
WITH Instance^[i2] DO
IF Synthesized IN Properties THEN
k := ToBit0 (Class, i2);
WriteS (f, " INCL (yyt->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
ELSIF Inherited IN Properties THEN
k := ToBit1 (Selector, i2 - AttrCount - Selector^.Child.InstOffset);
WriteS (f, " INCL (yyt->"); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
WriteS (f, " return;"); WriteNl (f);
END;
END;
;
RETURN;
END;
END;
END;
END;
END EvalImplC;
PROCEDURE CompBitInfo (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 399 "" *)
WITH t^.Class DO
(* line 400 "" *)
BitIndexSize := AttrCount;
(* line 401 "" *)
MakeArray (BitIndex, BitIndexSize, TSIZE (tBitInfo));
(* line 402 "" *)
i := 1;
(* line 403 "" *)
gBitIndex := BitIndex;
(* line 404 "" *)
ForallAttributes (t, CompBitInfo);
(* line 405 "" *)
MaxBit := Max (i, MaxBit);
(* line 406 "" *)
MaxInstCount := Max (InstCount, MaxInstCount);
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 408 "" *)
LOOP
WITH t^.Child DO
(* line 410 "" *)
IF NOT (({Input, Test, Dummy} * Properties = {})) THEN EXIT; END;
(* line 411 "" *)
INC (i);
(* line 412 "" *)
gBitIndex ^ [AttrIndex] . ToBit := i;
(* line 413 "" *)
gBitIndex ^ [i] . ToAttr := AttrIndex;
RETURN;
END;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 408 "" *)
LOOP
WITH t^.Attribute DO
(* line 410 "" *)
IF NOT (({Input, Test, Dummy} * Properties = {})) THEN EXIT; END;
(* line 411 "" *)
INC (i);
(* line 412 "" *)
gBitIndex ^ [AttrIndex] . ToBit := i;
(* line 413 "" *)
gBitIndex ^ [i] . ToAttr := AttrIndex;
RETURN;
END;
END;
END;
END CompBitInfo;
PROCEDURE CompInhIndices (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
b: INTEGER;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 418 "" *)
WITH yyTempo.yyR1 DO
WITH t^.Class DO
(* line 419 "" *)
;
(* line 420 "" *)
FOR j := AttrCount + 1 TO InstCount DO
WITH Instance^ [j] DO
IF Inherited IN Properties THEN
b := ToBit2 (t, Selector, j);
Include (InhIndices, b);
INC (InhIndexCount^ [b]);
END;
END;
END;
;
RETURN;
END;
END;
END;
END CompInhIndices;
PROCEDURE CountSynAttr (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 433 "" *)
LOOP
WITH t^.Class DO
(* line 434 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 435 "" *)
IF NOT (i <= BitCount) THEN EXIT; END;
(* line 436 "" *)
WITH Instance^ [BitIndex^ [i].ToAttr] DO
IF ({Synthesized, Left} <= Properties) AND NOT (Test IN Properties) THEN
INC (n);
END;
END;
;
RETURN;
END;
END;
END;
END CountSynAttr;
PROCEDURE TypeName (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 445 "" *)
LOOP
WITH t^.Class DO
(* line 446 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 447 "" *)
IF NOT (Trace IN Properties) THEN EXIT; END;
(* line 448 "" *)
WriteS (f, '"');
(* line 448 "" *)
WI (Name);
(* line 448 "" *)
WriteS (f, '",');
(* line 448 "" *)
WriteNl (f);
RETURN;
END;
END;
END;
END TypeName;
PROCEDURE GenS (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 453 "" *)
LOOP
WITH t^.Class DO
(* line 454 "" *)
IF NOT (NoCodeClass * Properties = {}) THEN EXIT; END;
(* line 455 "" *)
IF NOT (i <= BitCount) THEN EXIT; END;
(* line 456 "" *)
WITH Instance^ [BitIndex^ [i].ToAttr] DO
IF ({Synthesized, Left} <= Properties) AND NOT (Test IN Properties) THEN
Class := t;
IF n > 1 THEN
WriteS (f, " case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
END;
FOR j := 1 TO InstCount DO
IF IsRelated (BitIndex^ [i].ToAttr, j, DP) THEN
GenCall (t, j);
END;
END;
GenEvalAttr (t, BitIndex^ [i].ToAttr);
IF NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
WriteS (f, "{ register "); WI (itTree); WriteS (f, " yyr = yyt->"); WI (Name); WriteS (f, "."); WI (Attribute^.Child.Name);
WriteS (f, "; if (yyr->yyHead.yyParent == "); WI (iNoTree);
WriteS (f, ") { yyr->yyHead.yyOffset = "); WN (BitCount + Attribute^.Child.BitOffset);
WriteS (f, "; yyr->yyHead.yyParent = yyt; Init"); WI (iModule); WriteS (f, " (yyr); } }"); WriteNl (f);
END;
FOR i2 := 1 TO InstCount DO (* add group members *)
IF Instance^[i2].Action = Action THEN
WITH Instance^[i2] DO
IF Synthesized IN Properties THEN
k := ToBit0 (Class, i2);
IF k # i - 1 THEN
WriteS (f, " INCL (yyt->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
END;
ELSIF Inherited IN Properties THEN
k := ToBit1 (Selector, i2 - AttrCount - Selector^.Child.InstOffset);
WriteS (f, " INCL (yyt->"); WI (Class^.Class.Name); WriteS (f, "."); WI (Selector^.Child.Name);
WriteS (f, "->yyHead.yyIsComp"); WN (k DIV BSS); WriteS (f, ", "); WN (k MOD BSS); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
IF n > 1 THEN
WriteS (f, " break;"); WriteNl (f);
END;
END;
END;
;
RETURN;
END;
END;
END;
END GenS;
PROCEDURE GenE (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
ToCompute: tSet;
END;
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 499 "" *)
WITH yyTempo.yyR1 DO
WITH t^.Class DO
(* line 500 "" *)
;
(* line 501 "" *)
GetIterator (t);
n := 0;
j := 2;
LOOP
IF j > InstCount THEN EXIT; END;
WITH Instance^ [j] DO
IF {Dummy, Output, Test} * Properties # {} THEN
IF (Test IN Properties) OR
({Synthesized, Left} <= Properties) OR
({Inherited, Right} <= Properties) OR
({Inherited, Left} <= Properties) AND
NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) OR
({Synthesized, Right, Dummy} <= Properties) AND (Selector # Iterator) AND
(HasOutput IN Selector^.Child.Class^.Class.Properties) THEN
INC (n); EXIT;
END;
END;
END;
INC (j);
END;
IF (n = 0) AND ((Iterator = NoTree) OR NOT (HasOutput IN Iterator^.Child.Class^.Class.Properties)) THEN RETURN; END;
Class := t;
WriteS (f, " case k"); WI (Name); WriteS (f, ":"); WriteNl (f);
FOR j := 2 TO InstCount DO
WITH Instance^ [j] DO
IF {Dummy, Output} * Properties # {} THEN
IF ({Synthesized, Left} <= Properties) OR
({Inherited, Right} <= Properties) OR
({Inherited, Left} <= Properties) AND
NOT (Input IN Properties) AND (Attribute^.Kind = Tree.Child) THEN
GenCall (t, j);
ELSIF ({Synthesized, Right, Dummy} <= Properties) AND (Selector # Iterator) AND
(HasOutput IN Selector^.Child.Class^.Class.Properties) THEN
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteVisit (yyt, "'); WI (Selector^.Child.Name); WriteS (f, '"); ');
END;
WriteS (f, "yyE (yyt->"); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, ");"); WriteNl (f);
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, "yyVisitParent (yyt->"); WI (Name); WriteS (f, "."); WI (Selector^.Child.Name); WriteS (f, ");"); WriteNl (f);
END;
END;
END;
END;
END;
MakeSet (ToCompute, InstCount);
FOR i := 2 TO AttrCount DO
WITH Instance^ [i] DO
IF Test IN Properties THEN
FOR j := 2 TO InstCount DO
IF IsRelated (i, j, DP) THEN
IF {Synthesized, Inherited} * Instance^ [j].Properties # {} THEN
Include (ToCompute, j);
END;
END;
END;
END;
END;
END;
FOR i := 2 TO InstCount DO
WITH Instance^ [i] DO
IF ({Synthesized, Left, Output} <= Properties) OR
({Inherited, Right, Output} <= Properties) THEN
Exclude (ToCompute, i);
END;
END;
END;
WHILE NOT IsEmpty (ToCompute) DO
GenCall (t, Extract (ToCompute));
END;
ReleaseSet (ToCompute);
FOR i := 2 TO AttrCount DO
IF Test IN Instance^ [i].Properties THEN
GenEvalAttr (t, i);
END;
END;
IF (Iterator = NoTree) OR NOT (HasOutput IN Iterator^.Child.Class^.Class.Properties) THEN
WriteS (f, "return;"); WriteNl (f);
ELSE
IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
WriteS (f, 'yyWriteVisit (yyt, "'); WI (Iterator^.Child.Name); WriteS (f, '"); ');
END;
WriteS (f, "yyt = yyt->"); WI (Name); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, "; break;"); WriteNl (f);
END;
;
RETURN;
END;
END;
END;
END GenE;
PROCEDURE CompOutput (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 591 "" *)
LOOP
WITH t^.Class DO
(* line 592 "" *)
IF NOT (NOT (HasOutput IN Properties)) THEN EXIT; END;
(* line 593 "" *)
Success := FALSE;
(* line 594 "" *)
ForallAttributes (t, CompOutput);
(* line 595 "" *)
ForallClasses (Extensions, CompOutput2);
(* line 596 "" *)
IF NOT (Success) THEN EXIT; END;
(* line 597 "" *)
INCL (Properties, HasOutput);
(* line 598 "" *)
IsStable := FALSE;
RETURN;
END;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 600 "" *)
LOOP
WITH t^.Child DO
(* line 601 "" *)
IF NOT ((Output IN Properties) OR (HasOutput IN Class ^ . Class . Properties)) THEN EXIT; END;
(* line 602 "" *)
Success := TRUE;
RETURN;
END;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 604 "" *)
LOOP
WITH t^.Attribute DO
(* line 605 "" *)
IF NOT (({Test, Output} * Properties # {})) THEN EXIT; END;
(* line 606 "" *)
Success := TRUE;
RETURN;
END;
END;
END;
END CompOutput;
PROCEDURE CompOutput2 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 611 "" *)
LOOP
WITH t^.Class DO
(* line 612 "" *)
IF NOT (HasOutput IN Properties) THEN EXIT; END;
(* line 613 "" *)
Success := TRUE;
RETURN;
END;
END;
END;
END CompOutput2;
PROCEDURE ToBit0 (yyP2: Tree.tTree; yyP1: INTEGER): INTEGER;
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
(* line 617 "" *)
RETURN yyP2 ^ . Class . BitIndex ^ [yyP1] . ToBit - 1;
END ToBit0;
PROCEDURE ToBit1 (yyP4: Tree.tTree; yyP3: INTEGER): INTEGER;
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
(* line 620 "" *)
RETURN yyP4 ^ . Child . Class ^ . Class . BitIndex ^ [yyP3] . ToBit - 1;
END ToBit1;
PROCEDURE ToBit2 (yyP7: Tree.tTree; yyP6: Tree.tTree; yyP5: SHORTCARD): INTEGER;
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
yyV1: INTEGER;
END;
END; END;
BEGIN
(* line 623 "" *)
WITH yyTempo.yyR1 DO
(* line 624 "" *)
WITH yyP6^.Child DO
RETURN yyP7^.Class.BitCount + BitOffset +
Class^.Class.BitIndex^ [yyP5 - yyP7^.Class.AttrCount - InstOffset].ToBit - 1;
END;
;
RETURN yyV1;
END;
END ToBit2;
PROCEDURE ToAttr (yyP9: Tree.tTree; yyP8: INTEGER): INTEGER;
(* line 631 "" *)
VAR a: SHORTCARD;
VAR yyTempo: RECORD CASE : INTEGER OF
| 1: yyR1: RECORD
yyV1: INTEGER;
END;
END; END;
BEGIN
(* line 632 "" *)
WITH yyTempo.yyR1 DO
(* line 633 "" *)
WITH yyP9^.Class DO
FOR a := AttrCount + 1 TO InstCount DO
WITH Instance^ [a] DO
IF ({Input, Test, Dummy} * Properties = {}) AND
(ToBit2 (yyP9, Selector, a) = yyP8) THEN RETURN a; END;
END;
END;
END;
RETURN 0;
;
RETURN yyV1;
END;
END ToAttr;
PROCEDURE BeginEvalC3;
BEGIN
END BeginEvalC3;
PROCEDURE CloseEvalC3;
BEGIN
END CloseEvalC3;
PROCEDURE yyExit;
BEGIN
IO.CloseIO; System.Exit (1);
END yyExit;
BEGIN
yyf := IO.StdOutput;
Exit := yyExit;
BeginEvalC3;
END EvalC3.